home *** CD-ROM | disk | FTP | other *** search
/ Chip 1996 April / CHIP 1996 aprilis (CD06).zip / CHIP_CD06.ISO / hypertxt.arj / 9304 / CGAEGA.CD < prev    next >
Text File  |  1995-04-19  |  19KB  |  326 lines

  1.  
  2.           @VGrafikus konvertálások -- 3. rész@N
  3.  
  4.           @VCGA, EGA@N
  5.  
  6.           A  fekete-fehér  üzemmódok  után  éppen  ideje,  hogy valami
  7.           színesebb  témával  is foglalkozzunk. Amíg az egyre olcsóbbá
  8.           váló  VGA  teljesen  ki nem szorítja, a CGA és EGA adapterek
  9.           tekinthetôk   hazánkban  a  legelterjedtebb  középkategóriás
  10.           vezérlôknek.
  11.  
  12.  
  13.           Míg  a  régi  monokróm  rendszerek, és a piacot egyre inkább
  14.           uraló  SVGA  specifikus jellegûek, a CGA és az EGA általános
  15.           célokra   készült,   mintegy   kompromisszumra  törekedve  a
  16.           nagyobb  felbontás  és az alternatív színhasználat nyújtotta
  17.           elônyök között.
  18.  
  19.           Sajnos  ismét  igaza  lett Murphynek: azok a dolgok, amelyek
  20.           egyformán  jók  mindenre,  azok  semmire  sem jók igazán. Ma
  21.           már  tudjuk, hogy hiba volt a nyolcvanas évek közepén piacra
  22.           dobni  elôször  a CGA, késôbb az EGA rendszereket. A gyártók
  23.           nem   akartak   elfogadhatatlan  árakat  szabni,  a  memória
  24.           viszont  akkor  még  nagyon  drága  volt.  Emiatt  a  színek
  25.           számának  növelésével  drasztikusan  csökkenteniük kellett a
  26.           felbontást.  îgy  születtek  az  olyan  rémálmok, mint a CGA
  27.           160x200   (!)   pixeles   felbontása   16  színnel,  vagy  a
  28.           320x200-as,  4  színnel.  Hamar kiderült persze, hogy ezek a
  29.           lehetôségek    mind    komoly    munkára,    mind    játékra
  30.           alkalmatlanok.   îgy   a   fejlesztôk  ismét  léptek  egyet.
  31.           Eljutottak  16  színig,  de  ekkor  ""félúton" megtorpantak,
  32.           ahelyett,  hogy  pixelenként  további 4 bit felhasználásával
  33.           megalkották volna a mai VGA megjelenítôk megfelelôjét.
  34.  
  35.           Furcsa  ellentmondásnak  tûnik, de egy nagyfelbontású színes
  36.           EGA  kép (640x350/16) kétszer annyi memóriát igényel, mint a
  37.           hozzá  képest káprázatos szín- és árnyalathûségû 320x200-as,
  38.           szabványos  VGA  ábrázolások.  Egy  általános, lapozható EGA
  39.           kártya  pedig 256 Kbyte memóriával bír, ami bôven elég lenne
  40.           egy    azonosan   nagyfelbontású,   ámde   256   színû   kép
  41.           megjelenítéséhez!  Hogy  miért nem gyártottak mégis VGA-kat,
  42.           azt  talán  csak  a  monitorgyártók  és a piackutatók tudnák
  43.           megmondani.   Tény,   hogy   grafikai   szempontból  mindkét
  44.           rendszer    nagyon    elônytelenül   lett   kialakítva,   és
  45.           komoly  tudás  kell  ahhoz,  hogy  a  szegényes  lehetôségek
  46.           felhasználásával  szépnek  nevezhetô  képet  varázsoljunk  a
  47.           monitorra.
  48.  
  49.           Emlékeztetôül:  a  grafikus  konvertálásoknak  három  fázisa
  50.           van.  Az  elsô  egy  köztes  információhalmaz  leképzése  az
  51.           eredeti  képrôl,  a  második  a  célüzemmód  felkészítése  a
  52.           kapott  információ  fogadására,  végül  a harmadik az átvitt
  53.           információ  megjelenítése az adott üzemmódban. E három fázis
  54.           közül   a   középsôt  nem  kellett  használnunk  a  monokróm
  55.           adapterek esetében. Most erre is rákényszerülünk.
  56.  
  57.  
  58.            @VCGA@N
  59.  
  60.           Elsôként  a  nagy  veteránnal,  a  CGA-val foglalkozunk. Két
  61.           színes      grafikus     üzemmóddal     kell     számolnunk:
  62.           160x200/16-ossal  és  a  320x200/4-essel.  Közülük az utóbbi
  63.           az elterjedt, a ROM BIOS is csak ezt támogatja.
  64.  
  65.           Hogy  megállapíthassuk  a  vörös,  zöld  és  kék  alapszínek
  66.           telítettségét  egy  adott  ponton  vagy annak környezetében,
  67.           tudnunk    kell    az   egyes   színek   értékhármasát.   Az
  68.           alappaletta-táblázat  tartalmazza  ezeket  az adatokat (lásd
  69.           ott).   A   16,7   millió   színt   tárolni  képes  átviteli
  70.           információ  formátumának  megfelelôen  0-tól  255-ig vesznek
  71.           fel  értékeket  a  pixelek színösszetevôi. Ezek úgy kaphatók
  72.           meg,  hogy  egy  alap EGA üzemmódból átvesszük a palettát --
  73.           tehetjük,   mivel   ott   is   ezek   az  alapszínek.  Ebbôl
  74.           visszakapjuk  az  egyes színekben lévô alapszínek 0-tól 3-ig
  75.           terjedô   értékeit,  és  az  @KÉRTÉK  =  (EGA-érték/3)  *  255@N
  76.           függvény segítségével kapjuk az elôbbi táblázat értékeit.
  77.  
  78.           Most,  hogy  összetevôkre  bontva  értelmezni  tudunk minden
  79.           egyes  színt,  belevágunk  az  információ  leképzésébe. Elsô
  80.           pillantásra   szörnyen   bonyolultnak   tûnik  a  dolog,  de
  81.           korántsem  az.  Választhatjuk  azt az egyszerû megoldást is,
  82.           hogy  az  átviteli  pont  komponenseit  egyenlôvé tesszük az
  83.           adott  fizikai képpont komponensértékeivel -- persze így ott
  84.           vagyunk,  ahol  a  part szakad, mivel semmit nem javítottunk
  85.           az  eredetin.  Akárcsak  a monokróm konvertálásoknál, itt is
  86.           valahogy  átlagolnunk  kellene  a fizikai pont környezetében
  87.           lévô  pontokat.  Igen ám, csakhogy most nem kizárólag fekete
  88.           vagy  fehér  pontokkal találkozhatunk, hanem színesekkel is.
  89.           Eddig  egyszerûen  megszámoltuk  egy adott felületen a fehér
  90.           képpontokat,  ezt elosztottuk a felületen lévô összes pontok
  91.           számával,  a  végén  pedig  az eredményt 255-tel felszorozva
  92.           beillesztettük   a   köztes   file  mindhárom  komponensébe.
  93.           Mindezt  azért  tehettük  meg,  mert az alapüzemmód fehér és
  94.           fekete  színeiben,  illetve a létrejövô, feketétôl a fehérig
  95.           terjedô  szürkeskálában  mindhárom  színösszetevô kötelezôen
  96.           azonos   volt.  îgy  az  átlagképzési  mûveletet  elég  volt
  97.           elvégezni  egyszer,  az eredmény mindhárom komponens átlagát
  98.           jelentette.
  99.  
  100.           A  színes  megjelenítôknél  a  három  színkomponens teljesen
  101.           független   egymástól.   Emiatt   a   színösszetevôk   külön
  102.           kezelendôk,  átlagolandók és összegezendôk a mûveletek során
  103.           --  a  kép színei ekkor megtartják jellemzôiket. Tehát végsô
  104.           soron  ugyanúgy  járhatunk el, mint a monokróm adaptereknél.
  105.           A  különbség  csupán  az,  hogy most nem a pontokat, hanem a
  106.           pontok  azonos  komponenseit átlagoljuk egy átviteli képpont
  107.           leképzésekor  --  külön-külön.  îgy  három  értéket kapunk a
  108.           mûveletek  után:  a  vörös, a zöld és a kék átlagot. E három
  109.           értéket  mentjük el az adathalmaz megfelelô komponenseiként.
  110.           A  színkomponensenkénti  átlagképzés  lényege tehát az, hogy
  111.           az   adott  felületen  lévô  pixelek  azonos  komponenseinek
  112.           összegét      elosztjuk      a      lehetséges     maximális
  113.           komponensösszeggel,  és  az  eredményt felszorozzuk 255-tel:
  114.           @KXkomponensátlag    =    (Xkomponensek    összege    /    Max@N
  115.           @KXkomponensösszeg)  *  255@N,   ahol  az  @KX@N  a  vörös,  a  zöld
  116.           vagy a kék alapszínt jelenti.
  117.  
  118.           Lássuk,  mibôl  képezzük ezt az átlagot. A kisebb felbontású
  119.           alapüzemmódokban   nem   nagyon  bûvészkedhetünk,  meg  kell
  120.           elégednünk  azzal,  hogy  az  adott  pont  környezetében 2x2
  121.           képpontos  rasztert  olvasunk  le,  vagy  ha  nem  féltjük a
  122.           kontrasztot,  akkor megpróbálkozhatunk a 3x3-assal is. De ez
  123.           a  maximum,  fôleg  ha  a  160x200-as üzemmódban vagyunk. Ha
  124.           megvan  a  4  vagy 9 képpont színértéke, akkor a táblázatból
  125.           visszakeressük  az  adott  színhez  tartozó komponenseket és
  126.           elvégezzük   a   három   átlagképzést,  az  eredményt  pedig
  127.           eltároljuk.
  128.  
  129.           Hogy  ne legyen ilyen egyszerû az életünk, a fizikai képpont
  130.           valódi  színének  leolvasása  csak  a  160x200-as üzemmódban
  131.           ilyen  egyértelmû.  A  másik,  négyszínû  üzemmódban további
  132.           aljasságok  várnak ránk. Az itt kiolvasott színérték ugyanis
  133.           nem  a valódi színt tartalmazza, hanem csak egy indexet, ami
  134.           egy  belsô  palettára  mutat.  Két  ilyen  belsô  palettával
  135.           rendelkezik  a  CGA,  mindkettô  3+1 színt definiál. A ""+1"
  136.           szín  a  0-s értékû képpontoké, ez szabadon választható a 16
  137.           színû  palettáról  úgy,  hogy  háttérszínként beállítjuk. Az
  138.           1-es,  2-es  és  3-as  értékû színek nem módosíthatók, a 0-s
  139.           palettánál  ezek  a zöld (2), a vörös (4) és a barna (6), az
  140.           1-es  palettánál  pedig  a  ciánkék  (3),  a  bíbor (5) és a
  141.           fehér (7).
  142.  
  143.  
  144.            @VEGA@N
  145.  
  146.           A  CGA  megjelenítôvel  folytatott  hiábavaló  küzdelem után
  147.           rátérhetünk   az   EGA   grafikus   lehetôségeire.  Itt  más
  148.           érdekességekkel  kerülünk  szembe.  Továbbra is csak 16 szín
  149.           jeleníthetô  meg  egyszerre,  ezek azonban teljesen szabadon
  150.           választhatók  egy  64 elemû színpalettáról. E paletta minden
  151.           elemében  meghatározott  a  vörös,  a  zöld  és a kék színek
  152.           telítettsége.  A  telítettségi  skála  itt is négy fokozatra
  153.           van  bontva.  Az  alapszínek  telítettség-hármasainak minden
  154.           létezô  variációja  benne van a palettában (4 a harmadikon =
  155.           64).  Ez  egyébként az alapvetô különbség a CGA 16 és az EGA
  156.           64  elemû  színválasztéka  között.  Az  elôbbinél  az  adott
  157.           skálabontás   mellett   lehetséges   kombinációknak  csak  a
  158.           negyede  választható  ki.  A másik alapvetô különbség az EGA
  159.           sokkal  jobb  felbontása.  Négy  fontosabb,  azonosan  64/16
  160.           színû  üzemmóddal  fogunk  foglalkozni. Ezek a 320x200-as, a
  161.           640x200-as,  a  640x350-es és a 640x480-as üzemmódok. Utóbbi
  162.           voltaképpen  nem  is  EGA,  hanem  VGA üzemmód, de az azonos
  163.           színhasználat    és   hasonló   felbontás   miatt   EGA-ként
  164.           kezelendô.
  165.  
  166.           Ha  tudni  akarjuk  az  adott színértékhez tartozó tényleges
  167.           színt,  akkor  ki kell olvasnunk a 16 elemû, éppen érvényben
  168.           lévô  palettatáblát.  Minden  palettaelem  egy  byte, amiben
  169.           2--2--2  bit  képviseli  az  egyes  alapszínek  négyfokozatú
  170.           skáláját  (formátum  = 00rgbRGB). Egy adott szín vörös, zöld
  171.           és  kék  telítettsége  a palettatábla ama elemébôl olvasható
  172.           ki,  aminek az indexe megegyezik a vizsgált színértékkel. Az
  173.           adott   elembôl   kiolvassuk   a   megfelelô   biteket,   és
  174.           helyiértékeik    szerint   összeadva   ôket   megkapjuk   az
  175.           eredményt.  Keretes  cikkrészletünkben  a citromsárga színen
  176.           mutatjuk be a folyamatot.
  177.  
  178.           Vizsgáljuk  meg,  hogy  a színkomponensek ismeretében milyen
  179.           lehetôségeink  adódnak  az  átlagképzésre! A 320x200-as és a
  180.           640x200-as   felbontású   üzemmódokban  továbbra  sem  sokat
  181.           tehetünk,   az   alacsony   felbontás  megköti  a  kezünket.
  182.           Hasonlóan  kell tehát dolgoznunk, mint a CGA üzemmódokban --
  183.           esetleg  a 640x200-as felbontás mellett megkockáztathatjuk a
  184.           raszterméret  vízszintes kiterjesztését (3x2, 4x2, 4x3 stb).
  185.           A  dolog  a  640x350-es és a 640x480-as felbontásoknál válik
  186.           érdekessé.  Itt  már  lehetôségünk -- sôt szükségünk -- lesz
  187.           néhány  igényesebb  trükk  bevetésére. Ezek közül az egyik a
  188.           többfázisú  átlagképzés komponensenként elvégzett változatát
  189.           jelenti.
  190.  
  191.           Ha  ezekben  az  üzemmódokban  egyszerûen egy 2*2-es, 5*5-ös
  192.           vagy  még ennél is nagyobb raszter komponenseit átlagolnánk,
  193.           akkor  --  a  monokróm konvertálásokhoz hasonlóan -- kétféle
  194.           problémával  találnánk  magunkat szembe. Kis raszterméretnél
  195.           a  leképzett  információ egymás melletti, elméletileg azonos
  196.           színû  vagy  kis  árnyalatkülönbségû pontjai között túl nagy
  197.           lenne  az  indokolatlan  színkülönbség. Nagyobb rasztereknél
  198.           ugyan  teljesen  eltûnnének a színkülönbségek, a kép viszont
  199.           jóval  homályosabb  lenne.  Ennek  az  az  oka,  hogy  a kép
  200.           felépítése  során  annak  létrehozóját az a szándék vezette,
  201.           hogy  a  kép  egy  adott felületén -- mivel nem volt képes a
  202.           kívánt   színt  egy  fizikai  pixellel  kifejezni  --  olyan
  203.           pontokat   szórjon  viszonylag  egyenletesen  szét,  amelyek
  204.           komponenseinek  átlaga  a  lehetô  legjobban  megközelíti  a
  205.           kívánt  szín  komponenseit.  És  lehet,  hogy  ezt  nem  egy
  206.           2*2-es  vagy  5*5-ös mezôben valósította meg, esetleg nem is
  207.           állandó elrendezésben.
  208.  
  209.           Tehát    mindenképpen    szükségünk   van   nagy   felületek
  210.           olvasására,  amelyeket  azonban nem átlagolhatunk ellenôrzés
  211.           nélkül.  Szét kell választanunk azokat az értékeket, amelyek
  212.           beleszámíthatnak  az  átlagképzésbe és amelyek nem. Világos,
  213.           hogy  csak  azok  az  értékek juthatnak át a rostán, amelyek
  214.           komponenseiket   tekintve   viszonylag   közel   állnak   az
  215.           alapérték  komponenseihez  --  csak  ezekrôl feltételezhetô,
  216.           hogy   még   ugyanazt   a   felületet  próbálják  kifejezni.
  217.           Szándékos   a  ""színpont"  helyett  az  ""érték"  kifejezés
  218.           használata,       hiszen      két      szomszédos,      nagy
  219.           színkomponens-különbségû  színpontról még elképzelhetô, hogy
  220.           azonos   színfelületet   reprezentálnak,   de   két   egymás
  221.           melletti,  mondjuk  3x3-as mezô színkomponens-átlagairól már
  222.           szerencsére  nem  mondható el ugyanez -- így sokkal könnyebb
  223.           döntenünk.
  224.  
  225.           A   többfázisú   letapogatás   igen  jól  oldja  meg  ezt  a
  226.           feladatot.   Ez   az   eljárás  elôször  egy  3x3-as  mezôt,
  227.           mezônként  3x3 képpontot tartalmazó rasztert olvas le a pont
  228.           környezetében,   azaz   összesen   81   pixelt.   E   pontok
  229.           komponenseit    9   pontonként,   tehát   3x3-as   mezônként
  230.           átlagolja.  îgy  9  komponensátlagot  kapunk,  természetesen
  231.           mindegyik  átlagban  külön  vörös, zöld és kék értékkel. A 9
  232.           mezô  átlagai közül a középsô 3x3-as mezô átlagai lesznek az
  233.           alapértékek.  A  többi értéket ehhez fogjuk viszonyítani. Ki
  234.           kell  tehát  választanunk, hogy mely értékek számíthatnak az
  235.           átlagképzésbe.  Ehhez  egy  tûréshatárt  kell  definiálnunk,
  236.           mondjuk  a  maximálisan  lehetséges eltérés 25%-át. Meg kell
  237.           vizsgálnunk,  hogy  a  komponensek  összegzett  eltérése  az
  238.           alapértéktôl   eléri-e  ezt  a  tûréshatárt.  Az  összegzett
  239.           eltérés  értékét  úgy  tudjuk  kiszámítani,  hogy a vizsgált
  240.           átlag  és  az  alapátlag  azonos komponenseinek az eltérését
  241.           összeadjuk:    @KDIF    =(VR-AR)+(VG-AG)+(VB-AB)@N,   ahol   @KDIF@N
  242.           az  eltérés,  @KVR,  VG,  VB@N  a  vizsgált átlag vörös, zöld és
  243.           kék   komponensei,   @KAR,   AG,   AB@N   pedig   az   alapérték
  244.           ugyanezen összetevôi.
  245.  
  246.           A  maximális  eltérést  is elég könnyen ki tudjuk számítani,
  247.           hiszen  tudjuk,  hogy  hány  fokozatú  az EGA komponenseinek
  248.           árnyalati  skálája,  és  azt  is  tudjuk,  hogy  hány pontot
  249.           átlagoltunk  egy  mezôben.  Az  árnyalati  skála  0-tól 3-ig
  250.           terjed,  tehát  átszámítás  nélkül  két  pont  --  vagy  két
  251.           átlagolt  mezô  --  azonos  komponense  között  a  különbség
  252.           maximálisan  3  egységnyi.  E  módszert  követve a különbség
  253.           összesen  9  egység lehet, hiszen három komponensünk van. Ha
  254.           egész  számokkal dolgozunk, akkor jobban tesszük, ha még a 9
  255.           mezô   átlagának   az   elkészítése   elôtt   átszámítjuk  a
  256.           színpontok  komponensértékeit  a  16,7  millió színû (256-os
  257.           bontású)  skálára,  mivel így az élességet sokkal finomabban
  258.           tudjuk  majd  szabályozni,  és  az  árnyalatok  átmenetei is
  259.           jobbak  lesznek. Természetesen akár a raszterméreteket, akár
  260.           a  skálabontást  megváltoztatjuk,  a  maximális  eltérés  és
  261.           társparaméterei  sem  maradnak  ugyanolyanok.  A  8-as  ábra
  262.           mutatja be a többfázisú átlagképzés elvi vázlatát.
  263.  
  264.           Az  utolsó  lépésben  az átlagba beleszámító értékhármasokat
  265.           összetevônként  összeadjuk,  és  az  eredményt  elosztjuk az
  266.           összeget  alkotó értékek számával. Ezután, ha még nem tettük
  267.           meg,  az  eredményeket  átszámítjuk  16  millió  színbe,  és
  268.           eltároljuk a köztes file-ba.
  269.  
  270.           Miként   a   monokróm   konvertálásoknál,   most  is  kiváló
  271.           eredményeket  érhetünk  el  ezzel  az  eljárással -- érdemes
  272.           kipróbálni.
  273.  
  274.           @KNagy Gergely@N
  275.  
  276.           @<9304\EREDETI.GIF> Az eredeti kép, amelyrôl a tesztképek készültek@N
  277.           @<9304\2.GIF> CGA tesztkép, amelyrôl visszakonvertáltunk@N
  278.           @<9304\3.GIF> EGA tesztkép, amelyrôl visszakonvertáltunk@N
  279.           @<9304\4.GIF> A  CGA  képrôl  letapogatott  köztes  file   (egyfázisú@N
  280.           @<9304\4.GIF>leképzés, 3x3-as raszter)@N
  281.           @<9304\5.GIF>Az  EGA  képrôl  letapogatott  köztes  file (többfázisú@N
  282.           @<9304\5.GIF>leképzés)@N
  283.  
  284.  
  285.  
  286.                                 @VAlappaletta@N
  287.  
  288.           A 160x200-as CGA, az indexelt CGA és a standard EGA  üzemmód
  289.           alapértelmezés szerinti színértékeinek RGB komponensei:
  290.  
  291.           Index  Binárisan  Red  Green  Blue
  292.  
  293.           0      000|000      0    0      0
  294.           1      000|001      0    0    170
  295.           2      000|010      0  170      0
  296.           3      000|011      0  170    170
  297.           4      000|100    170    0      0
  298.           5      000|101    170    0    170
  299.           6      010|100    170   85      0
  300.           7      000|111    170  170    170
  301.           8      111|000     85   85     85
  302.           9      111|001     85   85    255
  303.           10     111|010     85  255     85
  304.           11     111|011     85  255    255
  305.           12     111|100    255   85     85
  306.           13     111|101    255   85    255
  307.           14     111|110    255  255     85
  308.           15     111|111    255  255    255
  309.  
  310.  
  311.  
  312.                              @VCitromsárga szín@N
  313.  
  314.           Az adott  pixel színkomponenseinek  kiszámítása a  megfelelô
  315.           palettaelem byte segítségével:
  316.  
  317.           Palettaelem = decimális 62, bináris 111|110.
  318.  
  319.           Színkomponens      r    g    b    R     G     B
  320.  
  321.           Bithelyiérték      85r  85g  85b  170r  170g  170b
  322.  
  323.           Sárgában szerepel  1    1    1    1     1     0
  324.  
  325.           Összegzett eredmény: vörös=255r, zöld=255g, kék=85b;  avagy:
  326.           R,G,B = 255,255,85.